

void update(int node, vector<int > & vec) {

    int l = 2 * node + 1;  //数组下标从0开始，这里注意l = 2* node + 1
    int r = l + 1;
    
    while (l < vec.size())
    {


        if ( r<vec.size() &&  vec[l] < vec[r]) l = r;  //注意这里 一方面要保证右节点存在才处理，另一方面总是node和l比较，因为node和子节点比较的时候，有可能子节点没有r节点

        if (vec[node] < vec[l]) {

            swap(vec[node], vec[l]);

            node = l;
            l = 2 * node + 1;
            r = l + 1;
        }
        else return;
    }

}

void rebuild(vector<int> &vec) {

    int node = vec.size() / 2 - 1;   //向下取整  ，如有三个节点时 3/2 -1 = 1 -1 = 0 
    for (int i = node; i >=0; i-- ) {
        update(i, vec);
    }

}




int main() {


    //vector<int> binary{ 1,2,3,4,5,6,7 };
    vector<int> binary{85,55,82,57,68,92,99,98,66,56};

    rebuild(binary);
   
}